# Introdução

Tem alguns sites estáticos e/ou compilados em produção que funcionam sincronizados com repositórios git.

Isto agiliza a administração porque na maioria dos casos, basta dar *push* em um repositório para que o site se atualize automaticamente.

Também é possível permitir que pessoas que não sabem ou não querem saber usar git consigam modificar sites através de serviços como github.

###### *PS: github é um lixo - [[desci]]*

Seja qual for o motivo, [[eu|desci]] vou tentar explicar como eu faço para sincronizar sites automaticamente por git.

[[!toc levels=4 startlevel=2]]

---

# Mão na massa

O [site da radio insurgente](https://radio.iikb.org) se atualiza diariamente com o [repositório git](https://notabug.org/iikb/radio.iikb.org), sendo que também atualiza automaticamente o [site na zeronet](https://zeronet.iikb.org/1Hu7LGL7m14Wz6soeJT3rAbgmRjQqCm1fD/), sendo este procedimento mais complexo.

Vamos botar um espelho do [site da rádio insurgente](https://radio.iikb.org) no ar, pra eventualidade do site atual [[cair por falta de pagamento de domínio|blog/Domínio_iikb.org_expirou]] ou coisa parecida.

## Acesso SSH

A primeira coisa a se fazer é ter acesso ssh ao servidor. Sem isto, todo o resto não faz sentido.

Na verdade a única coisa que definitivamente exige acesso ssh é editar o crontab, a menos que o servidor tenha outro mecanismo para isto. É possível fazer tudo somente com acesso FTP ou SFTP. Mas isto seria estúpido, quando (e se) eu tiver tempo, eu explico isto. Por ora vamos assumir que a(o) leitor(a) sabe o que é ssh e tem acesso.

    desci@localhost:~$ ssh iikb.org

## git clone

Tendo acesso ao servidor, a segunda coisa que se faz é clonar o repositório git do site da rádio. Se fosse outro site, o URL seria diferente:

    desci@iikb:~$ git clone https://notabug.org/iikb/radio.iikb.org.git

Pra verificar os *remotes* git deste repositório, entre no diretório e use o comando pertinente:

    desci@iikb:~$ cd radio.iikb.org
    desci@iikb:~/radio.iikb.org$ git remote -v
    origin  https://notabug.org/iikb/radio.iikb.org.git (fetch)
    origin  https://notabug.org/iikb/radio.iikb.org.git (push)

### (opcional) remotes alternativos e/ou redundantes

Eu poderia adicionar outros *remotes* também para atualizar espelhos em outros serviços de hospedagem git, por exemplo:

    desci@iikb:~/radio.iikb.org$ git remote add lixo https://github.com/iikb/radio.iikb.org.git
    desci@iikb:~/radio.iikb.org$ git remote add gitbull https://bull.codes/iikb/radio.iikb.org.git

Neste caso eu teria mais *remotes* além de **origin**:

    desci@iikb:~/radio.iikb.org$ git remote -v
    origin  https://notabug.org/iikb/radio.iikb.org.git (fetch)
    origin  https://notabug.org/iikb/radio.iikb.org.git (push)
    lixo  https://github.com/iikb/radio.iikb.org.git (fetch)
    lixo  https://github.com/iikb/radio.iikb.org.git (push)
    gitbull  https://bull.codes/iikb/radio.iikb.org.git (fetch)
    gitbull  https://bull.codes/iikb/radio.iikb.org.git (push)

Aprenda mais sobre remotes lendo o [manual](https://www.kernel.org/pub/software/scm/git/docs/git-remote.html) *(razoável e completo)*, a [documentação](https://git-scm.com/docs/git-remote) *(difícil, extendido e completo)* ou o [guia pra leigos](https://github.com/tldr-pages/tldr/blob/master/pages/common/git-remote.md) *(fácil, intuitivo e limitado)*.

## Atualizando manualmente

Eu sei que a ideia aqui é que tudo fique automático depois, mas é necessário entender como é que o computador vai fazer depois.

Toda vez que o repositório *origin* (ou outro) for atualizado, é necessário rodar o seguinte no repositório local (no servidor web que está servindo o site):

    desci@iikb:~/radio.iikb.org$ git pull origin master

Na eventualidade de eu estar atualizando com outro *remote*, eu usaria por exemplo:

    desci@iikb:~/radio.iikb.org$ git pull gitbull master

Ou ainda, se eu estivesse atualizando um site de desenvolvimento a partir de uma *branch* diferente de *master*, que é a padrão:

    desci@iikb:~/radio.iikb.org$ git pull origin teste

Se não der nenhum erro, os arquivos do site devem ser atualizados com a última versão do repositório git. Daqui pra frente, vamos testar meios de atualizar automaticamente. Digite `cd` na linha de comando para voltar ao diretório principal para as próximas instruções.

## Script em bash

[[Eu|desci]] pessoalmente mantenho um script em **bash** que atualiza todos os meus repositórios git, ou então somente um que eu forneço como parâmetro. Isto não é necessário no próximo passo porque o **cron** aceita comandos que mudam de diretórios, mas sinceramente eu nunca testei e não sei como fazer isto. Também não conheço ninguém que faz isto, todo mundo que eu conheço usa script em **bash** como tarefa no **cron**.

O caminho mais óbvio e que [[eu|desci]] estou acostumado a fazer é manter pelo menos um script que:

1. Entre no diretório onde está clonado o repositório (no nosso caso em `~/radio.iikb.org/`);
2. Atualize o repositório com `git pull`;
3. Trate os erros automaticamente;

Na verdade eu não tenho um script que faça o **3**, mas os outros dois, sim.

### (opcional) usar os scripts do [[desci]]

O script atualiza todos repositórios que são sub diretórios de `~/git` e está disponível no [notabug](https://notabug.org/desci/scripts/src/master/git-refresh.bash).

Eu normalmente instalo todos estes scripts em um servidor novo no diretório `~/bin` para utilizá-los diretamente na linha de comando do bash:

    desci@iikb:~$ git clone https://notabug.org/desci/scripts.git bin

Caso já exista o diretório `~/bin`, da pra copiar os scripts ao invés de clonar diretamente:

    desci@iikb:~$ git clone https://notabug.org/desci/scripts.git
    desci@iikb:~$ mkdir bin
    desci@iikb:~$ rsync -avhP scripts/* bin/

Depois disto é necessário atualizar a sessão:

    desci@iikb:~$ source .profile

E finalmente rodar o script em questão que é o:

    desci@iikb:~$ git-refresh.bash

No nosso caso este método não funcionaria porque a gente clonou o repositório em `~/radio.iikb.org` e não em `~/git/radio.iikb.org`. É um script feito para gerenciar vários repositórios git clonados. De qualquer forma, tu mesma(o) poderia editar o arquivo e adaptar às tuas necessidades, essa é a ideia.

### Jeito mais simples

O jeito simples é mais difícil e tu vai ter que fazer sozinha(o), o que é muito melhor, que aí tu aprende, para de ler meus tutoriais e começa a escrever os teus.

Um script mais simples que atualize somente o nosso repositório da rádio insurgente, e que vai ter que ser melhorado no futuro seria assim:

    #!/bin/bash
    ## Script pra atualizar o site da rádio insurgente
    ## Kopimi 2016 Desobediente Civil et al
    
    pushd ~/radio.iikb.org/
    /usr/bin/git pull
    popd

Basicamente isto entra no diretório onde está clonado o repositório, utiliza o comando `git pull``e sai do diretório.

#### Aonde eu escrevo isto?

Na prática, em qualquer lugar. No mundo ideal, isto deveria ser um script com permissão de execução em `~/bin`.

É tecnicamente possível rodar qualquer arquivo de texto como script no cron desta forma: `/bin/bash /home/desci/script.sh`, mesmo que o arquivo não tenha permissão de execução.

Mas o jeito certo seria:

    desci@iikb:~$ mkdir bin
    desci@iikb:~$ vim bin/atualizar-site

Eu uso **vim** mas também é possível mudar ali pra **nano**, **ed**, ou outro editor de texto. De qualquer forma, copie e cole, ou digite o script providenciado acima, ou um melhor, e salve o arquivo. Após isto, altere as permissões do arquivo:

    desci@iikb:~$ chmod ug+x bin/atualizar-site

Para verificar se está correto, o que deveria acontecer ao listar o diretório é algo parecido com:

    desci@iikb:~$ ls -l bin
    total 8
    -rwxr-xr-- 1 desci desci  152 Mai  9 06:11 atualizar-site

Na maioria dos casos, para que este script passe a rodar diretamente pela linha de comando, é necessário atualizar a sessão:

    desci@iikb:~$ source ~/.profile

Agora é possível atualizar o site simplesmente digitando:

    desci@iikb:~$ atualizar-site

Isto pode parecer trabalho demais pra fazer um comando inútil pra preguiçoso, mas conforme o script vai se tornando complexo, isto ajuda bastante. Quem administra servidores diariamente entende perfeitamente porquê fazer desta forma.

### Crontab

Agora finalmente vamos fazer o computador trabalhar sozinho.

Para editar a tabela do **cron** para o usuário atual, se utiliza o comando:

    desci@iikb:~$ crontab -e

Basicamente vamos adicionar uma linha no final do arquivo:

    @hourly    /home/desci/bin/atualizar-site

E salvar o arquivo para que o cron atualize a tabela.

Isto vai fazer com que o script rode de hora em hora. Poderíamos fazer um *cronjob* de cinco em cinco minutos, para sites que são atualizados com mais frequência, ou por pessoas impacientes:

    */5 * * * *    /home/desci/bin/atualizar-site

Ou ainda em um site que se atualize só uma vez por dia e toda vez que o servidor reinicia:

    @reboot    /home/desci/bin/atualizar-site
    @hourly    /home/desci/bin/atualizar-site

Qualquer uma destas linhas deve ser colocada no final do arquivo *crontab* que o comando acima abriu para edição. Substitua `desci` pelo teu nome de usuário, óbvio.

Acredito que isto seja o suficiente. Qualquer dúvida, entre em [[contato|desci]].
